import requests, pytest, allure
import os
import json

# self library
import readfile
import test_utils
import time

# 读取所有测试用例信息 - 列表格式
all_test = readfile.readExcel("./test/api_doc.xlsx", 'main_test')
print("所有测试用例：", all_test)



@pytest.mark.parametrize("case", all_test)
def test_case_exec(case):
    url = case['接口URL']
    method = case['请求方式']
    repeat = int(case['重复执行次数']) if case['重复执行次数'] is not None else 1
    repeat_interval_ms = int(case['执行间隔ms']) if case['执行间隔ms'] is not None else 100
    params = json.loads('{}' if case['URL参数'] is None else case['URL参数'])

    json_data = json.loads('{}' if case['请求json'] is None else case['请求json'])
    # print("请求json: ", json_data)

    for i in range(repeat):
        response = requests.request(
            url=url,
            method=method,
            params=params,
            json=json_data,
        )

        print("状态码：" + str(response.status_code))
        rsp_json_data = test_utils.decode_to_dict(response.content)
        print("实际接口响应内容：", rsp_json_data)

        assert case["预期状态码"] == response.status_code, f"第{i+1}次测试不通过，状态码不对，预期状态码：{case['预期状态码']}, 实际状态码：{response.status_code}"
        assert test_utils.check_condition(rsp_json_data, case["条件"]), f"第{i+1}次测试不通过，预期条件不满足，预期条件：{case['条件']}, 实际结果：{json_data}"

        time.sleep(repeat_interval_ms/1000) # 等待指定的时间间隔，再执行下一个测试用例

def main():
    pytest.main(['test/test.py', '-s', '--alluredir=allure-results']) # 使用pytest执行测试用例，生成一份文字版本测试报告
    # 借助allure测试报告生成技术 生成一份html版本的测试报告内容
    # 电脑配置allure环境  步骤1：让pytest把测试结果保存为allure格式 步骤2：调用allure生成html报告
    os.system(r"allure generate -c -o 测试报告") # python代码里面执行命令。 等于在命令行终端里面执行allure 

if __name__ == '__main__':
    main()